package TreeHole.mod;

import TreeHole.room.TreeHoleEnterRoom;
import TreeHole.save.TreeHoleSave;
import com.megacrit.cardcrawl.characters.AbstractPlayer;
import com.megacrit.cardcrawl.dungeons.AbstractDungeon;
import com.megacrit.cardcrawl.events.AbstractEvent;
import com.megacrit.cardcrawl.random.Random;
import com.megacrit.cardcrawl.saveAndContinue.SaveFile;

import java.util.ArrayList;

public abstract class TreeHoleBase {
    //currentType即树洞类型，用来作区分
    //初始化层级
    public abstract AbstractDungeon getDungeon(AbstractPlayer p, ArrayList<String> theList,int currentType);

    //加载层级
    public abstract AbstractDungeon getDungeon(AbstractPlayer p, SaveFile file,int currentType);

    //根据树洞类型决定是否是BOSS层级，这里主要是决定BOSS是否渲染
    public abstract boolean isBoss(int currentType);

    //树洞内BOSS房进入坐标Y（如不你不了解这是什么就填你BOSS结点的Y坐标-1）
    public abstract int getBossEnterY(int currentType);

    //层级标题（用以载入树洞场景时的UI显示）如：第三幕、终幕
    public abstract String getLevelNum(int currentType);

    //层级名称（用以载入树洞场景时的UI显示）如：深处
    public abstract String getLevelName(int currentType);

    //地图长度修正，参考值为 -560F*Settings.scale
    public abstract float getMapSize(int currentType);

    //滚动限制修正，由于树洞层级长度与普通层级不同，会有此限制，参考值为 -350F*Settings.scale
    public abstract float getScrollLimit(int currentType);

    //多种树洞mod启用时，这个选项用以跳转到你的事件，因此需要写一段选项描述
    public abstract String getEnterOption();

    //是否启用终幕 TheEnding 的结局树洞
    public abstract boolean enableTheEndingTreeHole();

    //进入事件，在树洞选择你mod的树洞时，会跳转到这个事件，同时提供一个独立的随机数生成器用来决定currentType生成
    public abstract AbstractEvent treeHoleEnterEvent(Random rngDuplicated);

    //从树洞离开后，会返回到这个事件
    public abstract AbstractEvent treeHoleOuterEvent(Random rngDuplicated);

    //进入树洞后调用的内容，默认进洞不回复生命，你可以在这里使用 AbstractDungeon.player.heal(amt);
    public abstract void triggerWhenEnterTreeHole(int currentType);

    //保存类的Class 用来读写json
    public abstract Class<?> getSaveClass();

    //保存时传入（你需要把你mod中保存对象返回）
    public abstract TreeHoleSave saveTreeHoleSave();

    //读取时获取（你需要在你mod中保存该对象）
    public abstract void loadTreeHoleSave(TreeHoleSave save);

    //以下有默认值
    //生成专有树洞节点的个数，默认为0
    public int getSpecificTreeHoleCount(){
        return 0;
    }

    //专有树洞节点类型，需要base TreeHoleEnterRoom
    public TreeHoleEnterRoom getSpecificTreeHoleEnterRoom(){
        return null;
    }

    //是否在通用树洞节点中出现自己的事件，默认允许
    public boolean enableSharedTreeHoleEvent(){
        return true;
    }
}
